アプリケーションで、TimesTenの単一接続を介して、TimesTenキャッシュ・グループまたはOracleのいずれかにSQL文を送信できます(『Oracle TimesTen In-Memory Databaseアーキテクチャ概要』のCache Connect to Oracleに関する章のパススルー機能の項を参照)。
SQLがTimesTenまたはOracleのいずれに送られるかは、SQL文の構成およびDSNのPassThrough属性または接続属性の設定によって決まります。PassThrough属性を設定して、TimesTen内のキャッシュされた表でローカル処理されるSQL文のタイプおよびOracleにリダイレクトされるSQL文のタイプを定義できます。
たとえば、PassThrough=0と設定すると、すべてのSQLがTimesTenで実行されます(これがデフォルトの設定です)。また、PassThrough=3と設定すると、すべてのSQLがOracleに渡されます。
図3.14に示すように、PassThrough=1を設定すると、TimesTenに存在しない表またはTimesTenで構文エラーを生成する表に対するSQLをパススルーできます。たとえば、キャッシュされた表(表A)に対するUPDATEはTimesTenキャッシュで処理されますが、TimesTenで検出されない表(表G)に対するUPDATEはOracleにパススルーされます。同様に、ttCacheStart、ttCkptなどのTimesTen固有のプロシージャはTimesTenで処理されますが、TimesTenでサポートされていないプロシージャはOracleにパススルーされます。
PassThrough=1と設定すると、DDL文はOracleにパススルーされません。TimesTenに存在しないプロシージャはOracleにパススルーされます。キャッシュ・グループ表のDML文に誤った構文が含まれている場合、そのDML文はOracleに送信されません。ただし、誤った構文を含むすべてのSELECT文は、Oracleに送信されます。
キャッシュ・グループを作成する場合は、多数のキャッシュ・グループ・タイプから選択できます(「システム管理キャッシュ・グループ・タイプの選択」を参照)。これらのキャッシュ・グループ・タイプの1つとして、キャッシュ・グループでのDML文による更新を禁止するREADONLYキャッシュ・グループがあります。READONLYキャッシュ・グループを使用する場合は、PassThrough=2を設定して、キャッシュ・グループ内の表に対するすべてのDML文をOracleに送ることができます。それ以外の場合、この設定はPassThrough=1と同じであるため、すべてのDDL文、DML以外の構文的に互換性のある文およびプロシージャは、TimesTenに送られます。
READONLY属性は、USERMANAGEDキャッシュ・グループ内の特定の表に設定できます(「キャッシュ・グループ属性およびキャッシュ表属性の定義」を参照)。READONLYキャッシュ・グループに関する前述のパススルー動作と同じパススルー動作が、USERMANAGEDキャッシュ・グループのREADONLY表に適用されます。図3.14のキャッシュ・グループの例について考えてみます。READONLY属性を表Aに設定し、PassThrough = 2を設定すると、表Aに対するUPDATEはOracleにパススルーされます。
パススルー機能は、AWTおよびSWTキャッシュ・グループでは使用しないことをお薦めします。AWTキャッシュ・グループでの更新は、定義上はキャッシュと非同期ですが、パススルーによって同期するようにレンダリングされ、それによって意図しない結果になる場合があります。SWTキャッシュ・グループでの更新は、パススルー機能が実装されている場合、自己デッドロックが発生する可能性があります。
SQL文がTimesTenで実行されるか、Oracleにパススルーされるかの決定に対するPassThrough属性設定の影響およびその状況の詳細は、『Oracle TimesTen In-Memory Database APIおよびSQLリファレンス・ガイド』のデータ・ストア属性に関する章のPassThroughの項を参照してください。
DSNのPassThrough設定は、ttIsqlセッションのパススルー・コマンドで上書きできます。ttOptSetFlagプロシージャをコールし、optflagパラメータとしてpassthroughを指定し、optvalパラメータとして新しいパススルー設定を指定することによって、プログラムでも特定のトランザクションのパススルー設定を再設定できます。新しいパススルー設定はすぐに有効になります。トランザクションの最後に、パススルーはPassThrough属性で指定されている元の値にリセットされます。